第一章:初識Hadoop
第二章:更高效的WordCount
第三章:把別處的數據搞到Hadoop上
第四章:把Hadoop上的數據搞到別處去
第五章:快一點吧,我的SQL
第六章:「一夫多妻制」
第七章:越來越多的分析任務
第八章:我的資料要即時
第九章:我的資料要對外
第十章:很强的機器學習
經常有初學者會問,自己想往大數據方向發展,該學哪些技術,學習路線是什麼樣的,覺得大數據很火,就業很好,薪資很高……首先,如果你確定了想往這個方面發展,先考慮自己的過去從業經歷、專業、興趣是什麼。電腦專業 — — 作業系統、硬體、網路、伺服器?軟體專業 — — 軟體發展、程式設計、寫程式碼?還是數學、統計學專業 — — 對資料和數位特別感興趣?
其實這就是想告訴你大數據的三個發展方向,平台搭建/優化/運維/監控、大數據開發/設計/架構、資料分析/挖掘。
先聊一下大數據的4V特徵:
現如今,正式為了應對大數據的這幾個特點,開源的大數據框架越來越多,越來越強,先列舉一些常見的:
檔存儲:Hadoop HDFS、Tachyon、KFS
離線計算:Hadoop MapReduce、Spark
流式、即時計算:Storm、Spark Streaming、S4、Heron
K-V、NOSQL資料庫:HBase、Redis、MongoDB
資源管理:YARN、Mesos
日誌收集:Flume、Scribe、Logstash、Kibana
消息系統:Kafka、StormMQ、ZeroMQ、RabbitMQ
查詢分析:Hive、Impala、Pig、Presto、Phoenix、SparkSQL、Drill、Flink、Kylin、Druid
分散式協調服務:Zookeeper
集群管理與監控:Ambari、Ganglia、Nagios、Cloudera Manager
資料採擷、機器學習:Mahout、Spark MLLib
資料同步:Sqoop
任務調度:Oozie
······
不論遇到什麼問題,先試試搜索並自己解決。
Google首選,或者用yahoo。
特別是對於入門來說,官方檔案永遠是首選檔案。
相信搞這塊的大多是文化人,英文湊合就行,實在看不下去的,請參考第一步。
Hadoop可以算是大數據存儲和計算的開山鼻祖,現在大多開源的大數據框架都依賴Hadoop或者與它能很好的相容。
關於Hadoop,你至少需要搞清楚以下是什麼:
HDFS目錄操作命令;
上傳、下載檔案命令;
提交運行MapReduce示例程式;
打開Hadoop WEB介面,查看Job運行狀態,查看Job運行日誌。
知道Hadoop的系統日誌在哪裡。
MapReduce:如何分而治之;
HDFS:數據到底在哪裡,什麼是副本;
Yarn到底是什麼,它能幹什麼;
NameNode到底在幹些什麼;
ResourceManager到底在幹些什麼;
仿照WordCount例子,自己寫一個(照抄也行)WordCount程式,
打包並提交到Hadoop運行。
不會Java的話,Shell、Python都可以,有個東西叫Hadoop Streaming。
如果能認真完成了以上幾步,恭喜你,你的一隻腳已經進來了。
如果不懂資料庫的同好先學習使用SQL句。
在1.6中,你寫(或者抄)的WordCount一共有幾行程式碼?
如果用SQL的話:
SELECT word,COUNT(1) FROM wordcount GROUP BY word;
這便是SQL的魅力,程式設計需要幾十行,甚至上百行程式碼,SQL一句就搞定;使用SQL處理分析Hadoop上的資料,方便、高效、易上手、更是趨勢。不論是離線計算還是即時計算,越來越多的大數據處理框架都在積極提供SQL介面。
Hive算是數倉工具,安裝不難,網上有很多教程,配置完成後,可以正常進入Hive命令列。
嘗試在Hive中創建wordcount表,並運行2.2中的SQL語句。在Hadoop WEB介面中找到剛才運行的SQL任務。看SQL查詢結果是否和1.4中MapReduce中的結果一致。
明明寫的是SQL,為什麼Hadoop WEB介面中看到的是MapReduce任務?
創建、刪除表;載入數據到表;下載Hive表的數據;並學習更多關於Hive的語法和命令。
以上如果按照第一章和第二章的流程認真完整的走了一遍後,應該已經具備以下技能和知識點:
0和Hadoop2.0的區別
MapReduce的原理(還是那個經典的題目,一個10G大小的檔,給定1G大小的記憶體,如何使用Java程式統計出現次數最多的10個單詞及次數);
HDFS讀寫資料的流程;向HDFS中PUT數據;從HDFS中下載數據;
自己會寫簡單的MapReduce程式,運行出現問題,知道在哪裡查看日誌;
會寫簡單的SELECT、WHERE、GROUP BY等SQL語句;
Hive SQL轉換成MapReduce的大致流程;
Hive中常見的語句:創建表、刪除表、往表中載入資料、分區、將表中數據下載到本地;
從上面的學習,你已經瞭解到,HDFS是Hadoop提供的分散式存儲框架,它可以用來存儲海量資料,MapReduce是Hadoop提供的分散式運算框架,它可以用來統計和分析HDFS上的海量資料,而Hive則是SQL On Hadoop,Hive提供了SQL介面,開發人員只需要編寫簡單易上手的SQL語句,Hive負責把SQL翻譯成MapReduce,提交運行。
此時,你的認知中「大數據平臺」是這樣的:
那麼問題來了,海量資料如何到HDFS上呢?
此處也可以叫做資料獲取,把各個資料來源的資料獲取到Hadoop上。
put命令在實際環境中也比較常用,通常配合shell、python等指令碼語言來使用。建議需熟練掌握。
HDFS提供了寫資料的API,自己用程式設計語言將資料寫入HDFS,put命令本身也是使用API。
實際環境中一般自己較少編寫程式使用API來寫資料到HDFS,通常都是使用其他框架封裝好的方法。比如:Hive中的INSERT語句,Spark中的saveAsTextfile等。
可以嘗試瞭解原理,試著寫幾個Demo。
Sqoop是一個主要用於Hadoop/Hive與傳統關係型資料庫Oracle/MySQL/SQLServer等之間進行資料交換的開源框架。
就像Hive把SQL翻譯成MapReduce一樣,Sqoop把你指定的引數翻譯成MapReduce,提交到Hadoop運行,完成Hadoop與其他資料庫之間的資料交換。
自己下載和配置Sqoop(建議先使用Sqoop1,Sqoop2比較複雜)。
瞭解Sqoop常用的配置引數和方法。
使用Sqoop完成從MySQL同步資料到HDFS;
使用Sqoop完成從MySQL同步資料到Hive表;
如果後續選型確定使用Sqoop作為資料交換工具,那麼建議熟練掌握,否則,瞭解和會用Demo即可。
Flume是一個分散式的海量日誌採集和傳輸框架,因為「採集和傳輸框架,所以它並不適合關係型資料庫的資料獲取和傳輸。Flume可以即時的從網路通訊協定、消息系統、檔案系統採集日誌,並傳輸到HDFS上。因此,如果你的業務有這些資料來源的資料,並且需要即時的採集,那麼就應該考慮使用Flume。
下載和配置Flume。使用Flume監控一個不斷追加資料的檔,並將資料傳輸到HDFS;
Flume的配置和使用較為複雜,如果你沒有足夠的興趣和耐心,可以先跳過Flume。
之所以介紹這個,是因為以前某公司客戶目前使用的Hadoop與關係型資料庫資料交換的工具,就是之前基於DataX開發的,個人感覺非常好用。現在DataX已經是3.0版本,支持很多資料來源。你也可以在其之上做二次開發。
有興趣的可以研究和使用一下,對比一下它與Sqoop。
至此,你的「大數據平臺」應該是這樣的:
前面介紹了如何把資料獲取到Hadoop上,資料到Hadoop上之後,便可以使用Hive和MapReduce進行分析了。那麼接下來的問題是,分析完的結果如何從Hadoop上同步到其他系統和應用中去呢?
其實此處的方法和第三章基本一致的。
把HDFS上的檔GET到本地。需要熟練掌握。
原理同3.2.
原理同3.3。
使用Sqoop完成將HDFS上的檔同步到MySQL;
使用Sqoop完成將Hive表中的資料同步到MySQL;
原理同3.4
此時,「你的大數據平臺」應該是這樣的:
走完第三章和第四章的流程,那麼你應該已經具備以下技能和知識點:
知道如何把已有的資料獲取到HDFS上,包括離線採集和即時採集;
知道sqoop(或者還有DataX)是HDFS和其他資料來源之間的資料交換工具;
知道flume可以用作即時的日誌採集;
至此,對於大數據平臺,應該已經掌握如何搭建Hadoopye叢集,把資料獲取到Hadoop上,使用Hive和MapReduce來分析資料,把分析結果同步到其他資料來源。
接下來的問題就是,Hive使用的越來越多,你會發現很多不愉快的地方,特別是速度慢,
大多情況下,明明我的資料量很小,它都要申請資源,啟動MapReduce來執行。
其實大家都已經發現Hive後臺使用MapReduce作為執行引擎,實在是有點慢。因此SQL On Hadoop的框架越來越多,按我的瞭解,最常用的按照流行度依次為SparkSQL、Impala和Presto.這三種框架基於半記憶體或者全記憶體,提供了SQL介面來快速查詢分析Hadoop上的資料。
目前我們的方案使用的是SparkSQL,至於為什麼用SparkSQL,原因大概如下:
什麼是Spark,什麼是SparkSQL。
Spark有的核心概念及名詞解釋。
SparkSQL和Spark是什麼關係,SparkSQL和Hive是什麼關係。
SparkSQL為什麼比Hive跑的快。
可參考:SparkSQL與Hive on Spark的比較
Spark有哪些部署模式?
如何在Yarn上運行SparkSQL?
使用SparkSQL查詢Hive中的表。
Spark不是一門短時間內就能掌握的技術,因此建議在瞭解了Spark之後,可以先從SparkSQL入手,循序漸進。
如果認真完成了上面的學習和實踐,此時,你的「大數據平臺」應該是這樣的:
其實我想說的是資料的一次採集、多次消費。
在實際業務場景下,特別是對於一些監控日誌,想即時的從日誌中瞭解一些指標(關於即時計算,後面章節會有介紹),這時候,從HDFS上分析就太慢了,儘管是透過Flume採集的,但Flume也不能間隔很短就往HDFS上滾動檔,這樣會導致小檔特別多。
為了滿足資料的一次採集、多次消費的需求,這裡要說的便是Kafka。
Kafka是一種高輸送量的分散式發佈訂閱消息系統,它可以處理消費者規模的網站中的所有動作流資料。這種動作(網頁流覽,搜索和其他使用者的行動)是在現代網路上的許多社會功能的一個關鍵因素。這些資料通常是由於輸送量的要求而透過處理日誌和日誌聚合來解決。
使用單機部署Kafka,並成功運行自帶的生產者和消費者例子。
使用Java程式自己編寫並運行生產者和消費者程式。
Flume和Kafka的叢集,使用Flume監控日誌,並將日誌資料即時發送至Kafka。
關於Kafka,可以參考 :Kafka — lxw的大數據田地
至此,「大數據平臺」應該擴充成這樣:
這時,使用Flume採集的資料,不是直接到HDFS上,而是先到Kafka,Kafka中的資料可以由多個消費者同時消費,其中一個消費者,就是將資料同步到HDFS。
總結》》
為什麼Spark比MapReduce快。
使用SparkSQL代替Hive,更快的運行SQL。
使用Kafka完成資料的一次收集,多次消費架構。
自己可以寫程式完成Kafka的生產者和消費者。
前面的學習已經掌握了大數據平台中的資料獲取、資料存儲和計算、資料交換等大部分技能,而這其中的每一步,都需要一個任務(程式)來完成,各個任務之間又存在一定的依賴性,比如,必須等資料獲取任務成功完成後,資料計算任務才能開始運行。如果一個任務執行失敗,需要給開發運維人員發送告警,同時需要提供完整的日誌來方便查錯。
不僅僅是分析任務,資料獲取、資料交換同樣是一個個的任務。這些任務中,有的是定時觸發,有點則需要依賴其他任務來觸發。當平臺中有幾百上千個任務需要維護和運行時候,僅僅靠crontab遠遠不夠了,這時便需要一個調度監控系統來完成這件事。調度監控系統是整個資料平臺的中樞系統,類似於AppMaster,負責分配和監控任務。
在第六章介紹Kafka的時候提到了一些需要即時指標的業務場景,即時基本可以分為絕對即時和准即時,絕對即時的延遲要求一般在毫秒級,准即時的延遲要求一般在秒、分鐘級。對於需要絕對即時的業務場景,用的比較多的是Storm,對於其他准即時的業務場景,可以是Storm,也可以是Spark Streaming。當然,如果可以的話,也可以自己寫程式來做。
通常對外(業務)提供資料訪問,大體上包含以下方面:
離線:比如,每天將前一天的資料提供到指定的資料來源(DB、FILE、FTP)等;
離線資料的提供可以採用Sqoop、DataX等離線資料交換工具。
即時:比如,線上網站的推薦系統,需要即時從資料平台中獲取給使用者的推薦資料,這種要求延時非常低(50毫秒以內)。
根據延時要求和即時資料的查詢需要,可能的方案有:HBase、Redis、MongoDB、ElasticSearch等。
OLAP分析:OLAP除了要求底層的資料模型比較規範,另外,對查詢的回應速度要求也越來越高,可能的方案有:Impala、Presto、SparkSQL、Kylin。如果你的資料模型比較規模,那麼Kylin是最好的選擇。
即席查詢:即席查詢的資料比較隨意,一般很難建立通用的資料模型,因此可能的方案有:Impala、Presto、SparkSQL。
這麼多比較成熟的框架和方案,需要結合自己的業務需求及資料平臺技術架構,選擇合適的。原則只有一個:越簡單越穩定的,就是最好的。
如果你已經掌握了如何很好的對外(業務)提供資料,那麼你的「大數據平臺」應該是這樣的:
這裡本人也沒有接觸太多,稍微講一下我們的業務場景應用,遇到的能用機器學習解決的問題大概這麼三類:
分類問題:包括二分類和多分類,二分類就是解決了預測的問題,就像預測一封郵件是否垃圾郵件;多分類解決的是文本的分類;
聚類問題:從使用者搜尋過的關鍵字,對使用者進行大概的歸類。
推薦問題:根據使用者的歷史流覽和點擊行為進行相關推薦。
大多數行業,使用機器學習解決的,也就是這幾類問題。
入門學習線路
數學基礎;
機器學習實戰(Machine Learning in Action),懂Python最好;
SparkMlLib提供了一些封裝好的演算法,以及特徵處理、特徵選擇的方法。
那麼把機器學習部分加進 「大數據平臺」。
我是「數據分析那些事」。常年分享資料分析乾貨,不定期分享好用的職場技能工具。可以關注我的臉書,第一時間掌握我的動態~